/*
 * Quercia Luciano
 * Algoritmi e Strutture Dati
 * a.a. 2009-10
 */


#ifndef _NODOBIN_H_
#define _NODOBIN_H_


template <class T>
class NodoBin {
public:
	NodoBin();
	~NodoBin();

	typedef NodoBin<T> * posizione;

	//Operatori
	T getValue();
	posizione getPadre();
	posizione getFiglioSinistro();
	posizione getFiglioDestro();

	void setValue(T);
	void setPadre(posizione);
	void setFiglioSinistro(posizione);
	void setFiglioDestro(posizione);

private:
	T value;
	posizione padre;
	posizione figliosinistro;
	posizione figliodestro;
};



/*****************************
 *        DEFINIZIONI        *
 *     dei metodi di Nodo    *
 *****************************/


template <class T>
NodoBin<T>::NodoBin() {
	padre = NULL ;
	figliodestro = NULL ;
	figliosinistro = NULL ;
}


template <class T>
NodoBin<T>::~NodoBin() {}


template <class T>
T NodoBin<T>::getValue() {
	return value;
}


template <class T>
typename NodoBin<T>::posizione NodoBin<T>::getPadre() {
	return padre;
}


template <class T>
typename NodoBin<T>::posizione NodoBin<T>::getFiglioSinistro() {
	return figliosinistro;
}


template <class T>
typename NodoBin<T>::posizione NodoBin<T>::getFiglioDestro() {
	return figliodestro;
}


template <class T>
void NodoBin<T>::setValue(T elem) {
	value = elem ;
}


template <class T>
void NodoBin<T>::setPadre(posizione ptr) {
	padre = ptr ;
}


template <class T>
void NodoBin<T>::setFiglioSinistro(posizione ptr) {
	figliosinistro = ptr ;
}


template <class T>
void NodoBin<T>::setFiglioDestro(posizione ptr) {
	figliodestro = ptr ;
}


#endif
